﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GS1.Entidad;
using System.Data;
using GS1.DataAccess;
using log4net;
using Oracle.DataAccess.Client;


namespace GS1.Datos
{
    public class EtiquetaDA
    {
        #region --- Variables y Constantes ---
        private static readonly ILog log = LogManager.GetLogger(typeof(EtiquetaDA));

        // Nombre procedimiento almacenado
		
		private const string PROCEDIMIENTO_RFID_EXISTEVEHICULO = "BETA.PPPG_CTRL_VEHI_RFID.pppr_exis_vehi";
		private const string PROCEDIMIENTO_RFID_OBTENERETIQUETA = "BETA.PPPG_CTRL_VEHI_RFID.pppr_obte_etiq";
        private const string PROCEDIMIENTO_RFID_REGISTRARETIQUETA = "BETA.PPPG_CTRL_VEHI_RFID.pppr_inse_etiq";
        private const string PROCEDIMIENTO_RFID_MODIFICARETIQUETA = "BETA.PPPG_CTRL_VEHI_RFID.pppr_modi_etiq";		
		
        // Parametros Entrada

        //Registrar
        private const string PARAM_COD_EPC = "PV_COD_EPC";
        private const string PARAM_COD_VEHI = "COD_VEHI";
        private const string PARAM_IND_ACTI = "IND_ACTI";
        private const string PARAM_NOM_COMP_CREA = "NOM_COMP_CREA";
        private const string PARAM_COD_USUA_CREA = "COD_USUA_CREA";

        //Modificar
        private const string PARAM_NOM_COMP_MODI = "PV_NOM_COMP_MODI";
        private const string PARAM_COD_USUA_MODI = "PV_COD_USUA_MODI";

        // Parametros Salida
        private const string PARAM_CURSOR = "PC_LIST";

        private const string CODEPC = "COD_EPC";
        private const string CODVEHI = "COD_VEHI";
        private const string INDACTI = "IND_ACTI";
        private const string NOMCOMPCREA = "NOM_COMP_CREA";
        private const string CODUSUACREA = "COD_USUA_CREA";
        private const string NOMCOMPMODI = "NOM_COMP_MODI";
        private const string CODUSUAMODI = "COD_USUA_MODI";
        private const string FECCREA = "FEC_CREA";
        private const string FECMODI = "FEC_MODI";
        
        private const string PARAM_CANT = "PN_CANT";
        private const string PARAM_ERRO = "PN_ERRO";
        private const string PARAM_MENS = "PV_MENS";

        #endregion

        #region --- Metodos Propios ---
        public Etiqueta obtenerEtiqueta(Etiqueta etiqueta)
        {
            Etiqueta etiquetaResultado = null;

            //DataSet dsEtiqueta = new DataSet();

            if (log.IsDebugEnabled)
            {
                log.Debug("obtenerEtiqueta(" + etiqueta.codEpc + ")");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexHermes))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_OBTENERETIQUETA;
                db.agregarParametro(PARAM_COD_EPC, DbType.String, ParameterDirection.Input, etiqueta.codEpc);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);				
				db.agregarParametro(PARAM_ERRO, DbType.Int32, ParameterDirection.Output, null);
                db.agregarParametro(PARAM_MENS, DbType.String, ParameterDirection.Output, null);
				
				db.ejecutar();

				OracleDataReader reader = db.obtenerOracleDataReader();

                ListaEtiqueta listaEtiqueta = new ListaEtiqueta();

                while (reader.Read())
                {
                   Etiqueta etiquetaLista = new Etiqueta();
                   etiquetaLista.codEpc = Convert.ToString(reader.GetValue(0));
                   etiquetaLista.codVehiculo = Convert.ToString(reader.GetValue(1));
                   etiquetaLista.indActi = Convert.ToInt32(reader.GetValue(2));

                   listaEtiqueta.Add(etiquetaLista);
                }
				
				if(listaEtiqueta.Count > 0 )
				{
					foreach ( Etiqueta etiquetaListado in listaEtiqueta)
					{
					    Etiqueta etiquetaObtenido = new Etiqueta();
						etiquetaObtenido.codEpc = etiquetaListado.codEpc;  
						etiquetaObtenido.codVehiculo = etiquetaListado.codVehiculo;
						etiquetaObtenido.indActi = etiquetaListado.indActi;

                        etiquetaResultado = etiquetaObtenido;
					}
					
					
				
				}
				else
				{
				  etiquetaResultado = null;				
				}
				
                Mensaje mensajeException = new Mensaje();
				
				Oracle.DataAccess.Types.OracleDecimal c = (Oracle.DataAccess.Types.OracleDecimal)db.obtenerParametro(PARAM_ERRO).Value;

                mensajeException.pn_erro = c.ToInt32();
                mensajeException.pv_mens = Convert.ToString(db.obtenerParametro(PARAM_MENS).Value);
				
				if (mensajeException.pn_erro != 0)
                {
                    log.Error(mensajeException.pn_erro);
                    etiquetaResultado = null;
                    //return etiquetaResultado;
                }

                /*IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsEtiqueta);

                if (dsEtiqueta.Tables.Count > 0)
                {
                    etiquetaResultado = generarEntidad(dsEtiqueta.Tables[0].Rows[0]);

                }*/
            }

            return etiquetaResultado;
        }

        public int contarEtiqueta(Etiqueta etiqueta)
        {
            int iContar = 0;

            //DataSet dsEtiqueta = new DataSet();

            if (log.IsDebugEnabled)
            {
                log.Debug("Validar si existe vehículo Nº : (" + etiqueta.codVehiculo + ")");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexHermes))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_EXISTEVEHICULO;
                db.agregarParametro(PARAM_COD_VEHI, DbType.String, ParameterDirection.Input, etiqueta.codVehiculo);
                db.agregarParametro(PARAM_CANT, DbType.Int32, ParameterDirection.Output, null);
                db.agregarParametro(PARAM_ERRO, DbType.Int32, ParameterDirection.Output, null);
                db.agregarParametro(PARAM_MENS, DbType.String, ParameterDirection.Output, null);

                db.ejecutar();
							
                Oracle.DataAccess.Types.OracleDecimal v = (Oracle.DataAccess.Types.OracleDecimal)db.obtenerParametro(PARAM_CANT).Value;
			    iContar = v.ToInt32();
				
				Mensaje mensajeException = new Mensaje();

                Oracle.DataAccess.Types.OracleDecimal c = (Oracle.DataAccess.Types.OracleDecimal)db.obtenerParametro(PARAM_ERRO).Value;
				
                mensajeException.pn_erro = c.ToInt32();
                mensajeException.pv_mens = Convert.ToString(db.obtenerParametro(PARAM_MENS).Value);

                if (mensajeException.pn_erro != 0)
                {
                    log.Error(mensajeException.pn_erro);

                    iContar = 0;
                    return iContar;
                }

                //return iContar;

                db.cerrar();

            }

            return iContar;

        }

        public Boolean registrarEtiqueta(Etiqueta etiqueta)
        {
            Boolean Registrar = false;
            //DataSet dsRegistrarEtiqueta = new DataSet();

            if (log.IsDebugEnabled)
            {
                log.Debug("registrarEtiqueta()");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexHermes))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_REGISTRARETIQUETA;
                db.agregarParametro(PARAM_COD_EPC, DbType.String, ParameterDirection.Input, etiqueta.codEpc);
                db.agregarParametro(PARAM_COD_VEHI, DbType.String, ParameterDirection.Input, etiqueta.codVehiculo);
                db.agregarParametro(PARAM_IND_ACTI, DbType.Int32, ParameterDirection.Input, etiqueta.indActi);
                db.agregarParametro(PARAM_NOM_COMP_CREA, DbType.String, ParameterDirection.Input, etiqueta.nomCompCrea);
                db.agregarParametro(PARAM_COD_USUA_CREA, DbType.String, ParameterDirection.Input, etiqueta.codUsuaCrea);
                //db.agregarParametro(PARAM_NOM_COMP_MODI, DbType.String, ParameterDirection.Input, etiqueta.nomCompModi);
                //db.agregarParametro(PARAM_COD_USUA_MODI, DbType.String, ParameterDirection.Input, etiqueta.codUsuaModi);
                db.agregarParametro(PARAM_ERRO, DbType.Int32, ParameterDirection.Output, null);
                db.agregarParametro(PARAM_MENS, DbType.String, ParameterDirection.Output, null);

                db.ejecutar();

                Mensaje mensajeException = new Mensaje();

                Oracle.DataAccess.Types.OracleDecimal c = (Oracle.DataAccess.Types.OracleDecimal)db.obtenerParametro(PARAM_ERRO).Value;

                mensajeException.pn_erro = c.ToInt32();
                mensajeException.pv_mens = Convert.ToString(db.obtenerParametro(PARAM_MENS).Value);

                if (mensajeException.pn_erro != 0)
                {
                    log.Error(mensajeException.pn_erro);

                    Registrar = false;
                }
				
				Registrar = true;
				
                db.cerrar();
            }
            return Registrar;
        }      

        public Boolean modificarEtiqueta(Etiqueta etiqueta)
        {
            Boolean Modificar = false;
            //DataSet dsModificarEtiqueta = new DataSet();

            if (log.IsDebugEnabled)
            {
                log.Debug("modificarEtiqueta()");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexHermes))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_MODIFICARETIQUETA;
                db.agregarParametro(PARAM_COD_EPC, DbType.String, ParameterDirection.Input, etiqueta.codEpc);
                db.agregarParametro(PARAM_IND_ACTI, DbType.Int32, ParameterDirection.Input, etiqueta.indActi);
                db.agregarParametro(PARAM_NOM_COMP_MODI, DbType.String, ParameterDirection.Input, etiqueta.nomCompModi);
                db.agregarParametro(PARAM_COD_USUA_MODI, DbType.String, ParameterDirection.Input, etiqueta.codUsuaModi);
				db.agregarParametro(PARAM_ERRO, DbType.Int32, ParameterDirection.Output, null);
                db.agregarParametro(PARAM_MENS, DbType.String, ParameterDirection.Output, null);

                db.ejecutar();

                Mensaje mensajeException = new Mensaje();

                Oracle.DataAccess.Types.OracleDecimal c = (Oracle.DataAccess.Types.OracleDecimal)db.obtenerParametro(PARAM_ERRO).Value;

                mensajeException.pn_erro = c.ToInt32();
                mensajeException.pv_mens = Convert.ToString(db.obtenerParametro(PARAM_MENS).Value);

                if (mensajeException.pn_erro != 0)
                {
                    log.Error(mensajeException.pn_erro);

                    Modificar = false;
                }
				
				Modificar = true;
				
                db.cerrar();
            }
            return Modificar;
        }      
        #endregion
     }
}
